// 统一请求工具
// 在开发环境中使用相对路径，生产环境使用完整URL
const BASE_URL = process.env.NODE_ENV === 'development' ? '' : 'http://localhost:10085'

// 是否使用模拟数据（用于开发测试）
const USE_MOCK = true

/**
 * 封装请求方法
 * @param {String} url 请求地址
 * @param {String} method 请求方法 GET/POST
 * @param {Object} data 请求数据
 * @param {Object} options 其他选项
 */
export const request = (url, method = 'GET', data = {}, options = {}) => {
  return new Promise((resolve, reject) => {
    // 获取token
    const token = uni.getStorageSync('token') || ''
    
    // 请求头
    const header = {
      'Content-Type': 'application/json',
      ...options.header
    }
    
    // 如果有token，添加到请求头
    if (token) {
      header['Authorization'] = `Bearer ${token}`
    }
    
    // 完整请求URL
    const fullUrl = BASE_URL + url
    
    console.log(`发起请求: ${method} ${fullUrl}`, data);
    
    // 使用模拟数据
    if (USE_MOCK) {
      console.log('使用模拟数据响应');
      setTimeout(() => {
        resolve({
          code: 1,
          data: mockResponse(url, method, data),
          msg: '操作成功'
        });
      }, 500);
      return;
    }
    
    // 请求
    uni.request({
      url: fullUrl,
      method,
      data,
      header,
      timeout: 15000, // 设置超时时间为15秒
      success: (res) => {
        console.log(`请求成功: ${method} ${fullUrl}`, res);
        const { data } = res
        // 判断业务状态码
        if (data.code === 1) {
          resolve(data)
        } else {
          // 获取错误消息，优先使用msg字段，其次使用message字段
          const errorMsg = data.msg || data.message || '请求失败';
          
          // 统一提示错误信息
          uni.showToast({
            title: errorMsg,
            icon: 'none',
            duration: 3000 // 显示时间延长到3秒，让用户有足够时间阅读
          })
          
          console.error('业务错误:', data);
          
          // 将完整的错误信息返回给调用者
          reject(data)
        }
      },
      fail: (err) => {
        console.error(`请求失败: ${method} ${fullUrl}`, err);
        uni.showToast({
          title: '网络请求失败，请检查网络',
          icon: 'none'
        })
        reject(err)
      }
    })
  })
}

/**
 * 模拟请求响应数据
 * @param {String} url 请求地址
 * @param {String} method 请求方法
 * @param {Object} data 请求数据
 * @returns {Object} 模拟的响应数据
 */
function mockResponse(url, method, data) {
  // 根据请求的URL返回不同的模拟数据
  if (url.includes('/app/user/login')) {
    return {
      token: 'mock_token_' + Date.now(),
      userInfo: {
        id: 1,
        name: '张三',
        phone: '13812345678'
      }
    };
  }
  
  if (url.includes('/app/user/info')) {
    return {
      id: 1,
      name: '张三',
      phone: '138****1234',
      avatar: '../../image/R.jpg'
    };
  }
  
  // 默认返回空对象
  return {};
}

// 定义GET请求方法
export const get = (url, params = {}, options = {}) => {
  // 如果是GET请求，参数需要拼接在URL上
  if (Object.keys(params).length > 0) {
    const queryString = Object.keys(params)
      .map(key => `${encodeURIComponent(key)}=${encodeURIComponent(params[key])}`)
      .join('&');
    url = `${url}?${queryString}`;
    // GET请求参数拼接在URL上，不需要在body中传递
    params = {};
  }
  
  return request(url, 'GET', params, options)
}

// 定义POST请求方法
export const post = (url, data = {}, options = {}) => {
  return request(url, 'POST', data, options)
}

export default {
  request,
  get,
  post
} 